Viewproviders - ПоставщикВида - это классы, определяющие, как объекты будут выглядеть в дереве проекта и 3D виде, и как они будут взаимодействовать с определёнными графическими действиями, такими как выбор.
Они дополняют объекты скриптов. В то время как базовый класс скриптового объекта определяет его properties - свойства data - данные , viewprovider определяет его properties - свойства view - вид . Эти свойства представления не являются существенной информацией об объекте, поскольку они указывают только поверхностную информацию, такую как ширина линии, цвет линии, цвет грани и т. д. В сеансе работы только с терминалом viewprovider не загружается, поскольку не будет интерфейса для работы с этими видимыми свойствами.
Как и свойства данных, свойства вида доступны через редактор свойств.
Классы viewproviders обычно содержат ViewProvider
в своем имени. Они назначаются на атрибут ViewObject
базового объекта.
В этом примере мы определяем два свойства для viewprovider, только если они ещё не существуют, и присваиваем им значения по умолчанию. Мы также определяем метод onChanged
, который запускается каждый раз, когда свойство изменяется. Нам нужно проверить свойство по имени, а затем вызвать один из двух методов, которые выполнят фактическую работу по обновлению шаблона или установке его размера.
# views/view_custom.py
class ViewProviderCustom:
"""Viewprovider of the custom object."""
def __init__(self, vobj):
self.Object = vobj.Object
self._set_properties(vobj)
vobj.Proxy = self
def _set_properties(self, vobj):
if not hasattr(vobj, "Pattern"):
vobj.addProperty("App::PropertyEnumeration",
"Pattern",
"Custom",
"Defines a hatch pattern for this object.")
vobj.Pattern = ["None", "diagonals", "cross", "brick"]
if not hasattr(vobj, "PatternSize"):
vobj.addProperty("App::PropertyFloat",
"PatternSize",
"Custom",
"Defines the size of the hatch pattern.")
vobj.PatternSize = 1
def onChanged(self, vobj, prop):
if prop in "Pattern":
self._set_pattern(vobj.Pattern)
if prop in "PatternSize":
self._set_size(vobj.PatternSize)
def _set_pattern(self, pattern):
...
def _set_size(self, size):
...
Обычно сначала добавляется прокси класс объекта, например, CustomObject
, а затем viewprovider, например, ViewProviderCustom
. Viewprovider можно назначать только после того, как мы убедились, что графический интерфейс доступен, поскольку в противном случае атрибут ViewObject
не существует, и использование этого элемента в качестве входного для нашего класса приведёт к ошибке.
import FreeCAD as App
import objects.custom as custom
import views.view_custom as view_custom
doc = App.newDocument()
obj = doc.addObject("Part::FeaturePython", "Custom")
custom.CustomObject(obj)
if App.GuiUp:
view_custom.ViewProviderCustom(obj.ViewObject)
Реализовав метод getIcon
, вы можете указать иконку, которая будет отображаться в дереве проекта в верхней части комбо панели.
Возвращаемое значение может быть полным путём к иконке.
import os
some_path = "/home/user/.FreeCAD/custom_icons"
class ViewProviderCustom:
...
def getIcon(self):
return os.path.join(some_path, "my_icon.svg")
Относительный путь к иконке в скомпилированном файле ресурса.
import MyModule_rc.py
class ViewProviderCustom:
...
def getIcon(self):
return ":/icons/my_icon.svg"
Необработанная иконка XPM (англ.) (рус.), которая по сути является ASCII-графикой.
import MyModule_rc.py
class ViewProviderCustom:
...
def getIcon(self):
return """
/* XPM */
static char *Some_icon_xpm[] = {
/* columns rows colors chars-per-pixel */
"16 16 3 1 ",
" c None",
". c #D71414",
"+ c #AA1919",
/* pixels */
" ",
" + + ",
" +.+ +.+ ",
" +.+ +.+ ",
" + + ",
" ++++ ",
" +....+ ",
" +...++ ",
" +..+++ ",
" +.++.+ ",
" ++++ ",
" + + ",
" +.+ +.+ ",
" +.+ +.+ ",
" + + ",
" "
};
"""
Смотри различные примеры на странице Пользовательские иконки в дереве проекта.